Rust Bevy を使ってみたメモ テトリスを作ってみる②

Rust Bevy を使ってみたメモ テトリスを作ってみる②

丸1日悩まされたリソースによるパニックが解決したので、やっと先に進むことができました…疲れた…

リソース問題を解決したことによって正方形に色を付けることができました!
bevyのバージョン:0.13.0

参考:Rustゲームエンジンbevyでテトリスを作る | makibishi throw
   List of all items in this crate (docs.rs)

//テトリミノの7種類を定義する
#[derive(Debug)]//Debugを継承するとprintln!でプリントできるようになるっぽいです
struct ColorAndShape {
    color: Color,
    shape: Vec<(i8, i8)>,
}

#[derive(Resource, Debug)]
struct TetriminoColorAndShape {
    tetrimino: Vec<ColorAndShape>,
}

fn setup(
    mut commands: Commands
) {
    commands.spawn(Camera2dBundle::default());
    commands.insert_resource(TetriminoColorAndShape {
        tetrimino: vec![
            ColorAndShape {
                color: Color::CYAN,
                shape: vec![(0, 0), (0, -1), (0, 1), (0, 2)],
            },
            ColorAndShape {
                color: Color::BLUE,
                shape: vec![(0, 0), (0, 1), (0, -1), (-1, -1)],
            },
            ColorAndShape {
                color: Color::ORANGE,
                shape: vec![(0, 0), (0, 1), (0, -1), (1, -1)],
            },
            ColorAndShape {
                color: Color::YELLOW,
                shape: vec![(0, 0), (0, 1), (1, 1), (1, 0)],
            },
            ColorAndShape {
                color: Color::LIME_GREEN,
                shape: vec![(0, 0), (0, 1), (1, 1), (-1, 0)],
            },
            ColorAndShape {
                color: Color::PURPLE,
                shape: vec![(0, 0), (0, 1), (1, 0), (-1, 0)],
            },
            ColorAndShape {
                color: Color::CRIMSON,
                shape: vec![(0, 0), (0, 1), (-1, 1), (1, 0)],
            }
        ]
    });
}

//テトリミノの生成
fn spawn_tetrimino(
    mut commands: Commands,
    tetrimino_color_and_shape: Res<TetriminoColorAndShape>,
    //リソースが存在するかどうかを確かめる
    mut fancy: Option<Res<TetriminoColorAndShape>>,
){
    //リソースが存在しなかった場合Errを出力するように(まぁパニックになってウィンドウが閉じるんですけどね)
    if let Some(fancy) = &mut fancy {
    commands.spawn(TetriminoBundle {
        tetrimino: Tetrimino,
        position : Position {
            x: 0,
            y: 0,
        },
        sprite   : SpriteBundle {
            sprite: Sprite {
                color: tetrimino_color_and_shape.tetrimino[1].color.clone(),
                ..default()
            },
            ..default()
        },
    });
    }else {
        println!("Err");
    }
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "Tetrus".into(),
                resolution: (WINDOW_WIDTH as f32, WINDOW_HEIGHT as f32).into(),
                resizable: false,
                ..default()
            }),
            ..default()
        }))
        .add_systems(Startup, (debug, setup))
        .add_systems(Update, (adjust, spawn_tetrimino))
        .run()
}

とりあえず前回から更新した部分を載せときます。全コード載せると長くなっちゃうしね

エラーの原因はRes<>とResMut<>をごちゃまぜで使っていたからっぽいですね…皆さんも気にしてみてください

やっぱりGitHubとか使うべきなんですかねぇ。ちょっと触ってみたのですがよくわかりませんでした。マスタがどうとかでローカルのコードをコピーできなかったし

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です